﻿#define _CRT_SECURE_NO_WARNINGS 1

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定，请勿修改，直接返回方法规定的值即可
     *
     *
     * @param str string字符串
     * @param n int整型
     * @return string字符串
     */
    string LeftRotateString(string str, int n)
    {
        if (str.size() == 0 || n == 0)
        {
            return str;
        }
        n %= str.size();
        while (n--)
        {
            char tmp = str[0];
            int begin = 0;
            int end = 1;
            while (end < str.size())
            {
                str[begin] = str[end];
                ++begin;
                ++end;
            }
            str[begin] = tmp;
        }
        return str;
    }
};

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定，请勿修改，直接返回方法规定的值即可
     *
     *
     * @param str string字符串
     * @param n int整型
     * @return string字符串
     */
    void reverse(string& str, int begin, int end)
    {
        while (begin < end)
        {
            char tmp = str[begin];
            str[begin] = str[end];
            str[end] = tmp;
            ++begin;
            --end;
        }
    }
    string LeftRotateString(string str, int n)
    {
        if (str.size() == 0 || n == 0)
        {
            return str;
        }
        n %= str.size();
        reverse(str, 0, n - 1);//逆置前半部分
        reverse(str, n, str.size() - 1);//逆置后半部分
        reverse(str, 0, str.size() - 1);//全体逆置
        return str;
    }
};

/*
汇编语言中有一种移位指令叫做循环左移（ROL），现在有个简单的任务，就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列  S ，请你把其循环左移 K 位后的序列输出。例如，字符序列 S = ”abcXYZdef” , 要求输出循环左移 3 位后的结果，即 “XYZdefabc”

数据范围：输入的字符串长度满足0≤len≤100  ，0≤n≤100
进阶：空间复杂度O(n) ，时间复杂度O(n)

示例1
输入：
"abcXYZdef",3

返回值：
"XYZdefabc"

*/

